import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.Stream;

/**
 * @author LiuYan
 * @date 2023/5/9
 * 对于JDK9和JDK10的完善，主要是对于Stream、集合等API的增强、新增ZGC垃圾收集器。
 */
public class ApiOptimization {

    public static void main(String[] args) {
        // 该方法返回满足指定条件的前元素，并在遇到第一个不满足条件的元素时停止处理
        List<Integer> list = Arrays.asList(1, 3, 5, 7, 9, 2, 4, 6, 8, 10);
        List<Integer> before = list.stream().takeWhile(n -> n < 5).collect(Collectors.toList());
        System.out.println(before); // Output: [1, 3]
        // 该方法返回满足指定条件的后元素，并在遇到第一个不满足条件的元素时停止处理
        List<Integer> after = list.stream().dropWhile(n -> n < 5).collect(Collectors.toList());
        System.out.println(after); // Output: [1, 3]
        // 该方法允许创建一个可能为 null 的单一元素流
        Stream.ofNullable(null).forEach(System.out::println);
        // 该方法现在支持提供初始值和限制条件，可以更灵活地使用。
        Stream.iterate(new int[]{0, 1}, arr -> new int[]{arr[1], arr[0] + arr[1]})
                .map(arr -> arr[0])
                .limit(10)
                .forEach(System.out::println);
        // 如果值为空，则抛出指定的异常
        // Optional.ofNullable(null).orElseThrow();

        // ifPresentOrElse() 方法对它们进行判断，并分别执行不同的操作
        Optional<String> optional1 = Optional.of("Hello");
        optional1.ifPresentOrElse(
                value -> System.out.println("Value is present: " + value),
                () -> System.out.println("Value is absent"));

        Optional<String> optional2 = Optional.empty();
        optional2.ifPresentOrElse(
                value -> System.out.println("Value is present: " + value),
                () -> System.out.println("Value is absent"));

        // 允许使用 IntFunction 参数指定数组类型
        List<String> strings = Arrays.asList("Java", "Python", "Ruby");
        String[] strArray1 = strings.toArray(new String[0]); // 使用指定类型的数组
        System.out.println(strArray1);
        String[] strArray2 = strings.toArray(String[]::new); // 使用 IntFunction 指定类型的数组
        System.out.println(strArray2);
        // 可以从不可变集合中创建副本
        List<String> list1 = List.of("java11");
        List<String> copyList = List.copyOf(list1);
        System.out.println(copyList);
        Set<String> set = Set.of("java11");
        Set<String> copySet = Set.copyOf(set);
        System.out.println(copySet);
        Map<String, Integer> map = Map.of("java", 11);
        Map<String, Integer> copyMap = Map.copyOf(map);
        System.out.println(copyMap);

    }
}
